<?php

declare(strict_types=1);

namespace Zlf\AppValidate\Rule;

/**
 * 元素是否在数组中验证
 *
 * 该类用于检查给定值是否存在于预定义的枚举数组中。它继承自 RuleAbstract，
 * 并提供了设置枚举数据、错误提示信息以及执行具体验证逻辑的方法。
 */
class AcceptedValidate extends RuleAbstract
{
    /**
     * 默认接受的枚举值
     *
     * 这些值被视为有效的“接受”状态。如果输入值与这些值之一匹配，则认为验证通过。
     *
     * @var array
     */
    public $_enums = ['ok', 'yes', 1, '1', true, 'true'];

    /**
     * 错误提示信息
     *
     * 当验证失败时显示的错误消息。可以包含占位符 `{label}`，将在实际使用时替换为字段标签。
     *
     * @var string
     */
    protected $_error = '请先确认{label}';

    /**
     * 设置枚举数据
     *
     * 允许调用者动态地设置或修改枚举值列表。
     *
     * @param array $enums 新的枚举值列表
     * @return AcceptedValidate 返回当前对象实例，便于链式调用
     */
    public function setEnums(array $enums)
    {
        $this->_enums = $enums;
        return $this;
    }

    /**
     * 验证输入值是否在枚举数组中
     *
     * 如果输入值为空且不允许跳过（_noSkipping 为 true），则直接返回 true。
     * 如果输入值存在于枚举数组中，则返回 true 并记录该值；否则添加错误信息并返回 false。
     *
     * @param mixed $value 待验证的值
     * @param string $label 字段标签，用于错误提示信息中
     * @return bool 验证结果：成功为 true，失败为 false
     */
    public function validate($value, string $label = ''): bool
    {
        // 如果允许跳过空值并且值为空，则直接通过验证
        if (empty($value) && $this->_noSkipping === true) {
            $this->_value = $value;
            return true;
        }
        // 检查值是否在枚举数组中
        if (in_array($value, $this->_enums)) {
            $this->_value = $value;
            return true;
        }
        // 如果值不在枚举数组中，添加错误信息并返回 false
        return $this->addError($this->_error, $label);
    }
}